package com.molichuxing.services.infrastructure.dao;

import com.molichuxing.framework.dao.RootMapper;
import com.molichuxing.framework.dto.TabDto;
import com.molichuxing.services.business.dto.response.OrderCarInfoAppDto;
import com.molichuxing.services.infrastructure.bean.OrderSubscribeBean;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

public interface OrderSubscribeMapper extends RootMapper<OrderSubscribeBean> {

    /**
     * 根据订单号查询
     *
     * @param orderCode 订单号
     * @return
     */
    OrderSubscribeBean getByOrderCode(@Param("orderCode") Long orderCode);

    /**
     * 据主订单查询订阅订单信息
     *
     * @param parentOrderCode
     * @param orderStatus
     * @return
     */
    List<OrderSubscribeBean> getByParentOrderCode(@Param("parentOrderCode") Long parentOrderCode,
                                                  @Param("orderStatus") Integer orderStatus);

    /**
     * 根据条件分页查询count
     *
     * @param params
     * @return
     */
    long getPageCount(@Param("params") Map<String, Object> params);

    /**
     * 根据条件分页查询
     *
     * @param params
     * @param pageNum
     * @param pageSize
     * @return
     */
    List<OrderSubscribeBean> getPage(@Param("params") Map<String, Object> params, @Param("pageNum") int pageNum,
                                     @Param("pageSize") int pageSize);

    /**
     * 根据用户id查询(order_time倒叙)
     *
     * @param userId     用户id
     * @param statusList 状态
     * @return
     */
    List<OrderSubscribeBean> getByUser(@Param("userId") Integer userId, @Param("statusList") List<Integer> statusList);

    /**
     * 根据车辆id查询(order_time倒叙)
     *
     * @param carId    车辆id
     * @param storeIds 门店ids
     * @return
     */
    List<OrderSubscribeBean> getByCar(@Param("carId") Integer carId, @Param("storeIds") List<Integer> storeIds);

    /**
     * 统计每种状态下的数据量
     *
     * @param storeIds 门店
     * @return
     */
    List<TabDto> getStatusStatistics(@Param("storeIds") List<Integer> storeIds);

    /**
     * 根据用户id查询订单号
     *
     * @param userId 用户id
     * @return
     */
    List<Long> getOrderCodeByUser(@Param("userId") Integer userId);

    /**
     * 根据用户id查询订单号
     *
     * @param userIds 用户id
     * @return
     */
    List<Long> getOrderCodeByUsers(@Param("userIds") List<Integer> userIds);

    /**
     * 根据用户id和订单状态查询车辆id
     *
     * @param userId      用户id
     * @param orderStatus 订单状态
     * @return
     */
    List<OrderCarInfoAppDto> getCarIdByUser(@Param("userId") Integer userId, @Param("orderStatus") Integer orderStatus);

    /**
     * 修改订单状态
     *
     * @param orderCode      订单号
     * @param preOrderStatus 修改前状态
     * @param orderStatus    修改后状态
     * @return
     */
    int modifyStatus(@Param("orderCode") Long orderCode, @Param("preOrderStatus") Integer preOrderStatus,
                     @Param("orderStatus") Integer orderStatus);

    /**
     * 支付完成修改订阅订单
     *
     * @param orderSubscribeBean
     * @param value
     * @return
     */
    int modifyPay(@Param("bean") OrderSubscribeBean orderSubscribeBean, @Param("oldStatus1") Integer oldStatus1,
                  @Param("oldStatus2") Integer oldStatus2);

    /**
     * 续订完成修改订单信息
     *
     * @param orderCode
     * @param isHaveSuborder
     * @return
     */
    int modifyRenew(@Param("orderCode") Long orderCode, @Param("isHaveSuborder") boolean isHaveSuborder);

    /**
     * 统计排序订单商品销量
     *
     * @return
     */
    List<Map<String, Object>> getStatisticsGoods();

    /**
     * 提车完成修改订阅订单
     *
     * @param orderSubscribeBean
     * @param oldStatus
     * @return
     */
    int modifyDelivery(@Param("bean") OrderSubscribeBean orderSubscribeBean, @Param("oldStatus") Integer oldStatus);

    /**
     * 加购成功后修改订单预警里程
     *
     * @param orderCode
     * @param totalPayMileage
     * @param value
     * @return
     */
    int modifyWarningMileageByPurchase(@Param("orderCode") Long orderCode,
                                       @Param("totalPayMileage") Integer totalPayMileage, @Param("status") Integer status);

    /**
     * 查询订阅里程订单待审核数量
     *
     * @return
     */
    Integer getOrderSubscribePendCount(Integer status);

    /**
     * 订阅超时未还车数量
     *
     * @return
     */
    Integer getSubscribeOvertimeCount();

    /**
     * 获取截止日未还车订单
     *
     * @param leaseExpire
     * @param value
     * @return
     */
    List<OrderSubscribeBean> getOrderExpire(@Param("leaseExpire") LocalDate leaseExpire,
                                            @Param("status") Integer status);

    /**
     * 订单结束时修改订阅订单
     *
     * @param orderSubscribeBean
     * @param oldStatus
     * @return
     */
    Integer modifyFinish(@Param("bean") OrderSubscribeBean orderSubscribeBean, @Param("oldStatus") Integer oldStatus);

    /**
     * 订单用车中修改
     *
     * @param orderSubscribeBean
     * @param value
     * @return
     */
    Integer modifyUse(@Param("bean") OrderSubscribeBean orderSubscribeBean, @Param("oldStatus") Integer oldStatus);

    /**
     * 订单租期结束修改结束里程
     *
     * @param orderCode  订单号
     * @param endMileage 结束时里程
     * @param status     订单状态
     * @return
     */
    int modifyEndMileageByExpire(@Param("orderCode") Long orderCode, @Param("endMileage") Integer endMileage,
                                 @Param("status") Integer status);

    /**
     * 查询最近N天，每天的订阅数量
     *
     * @param days
     * @return
     */
    List<Map<String, Object>> getSubscribeCountByDay(Integer days);

    /**
     * 查询N天前的订阅订单数量
     *
     * @return
     */
    Integer getSubscribeYesterdayCount(Integer days);

    /**
     * 查询订阅订单中所有用车中的
     *
     * @param value
     * @return
     */
    List<OrderSubscribeBean> getSubscribeTradeUse(int value);

    /**
     * 根据支付日期和订单状态查询
     *
     * @param payDate 支付日期
     * @param status  订单状态
     * @return
     */
    List<OrderSubscribeBean> getSubscribeByPayDate(@Param("payDate") LocalDate payDate,
                                                   @Param("status") Integer status);

    /**
     * 查询不存在续订单的订阅订单
     *
     * @param leaseExpire
     * @param status
     * @return
     */
    List<OrderSubscribeBean> getNoneRenewable(@Param("leaseExpire") LocalDate leaseExpire,
                                              @Param("status") Integer status);

    /**
     * 订单还车修改订单
     *
     * @param orderSubscribeBean
     * @param oldStatus
     * @return
     */
    int modifyReturnCar(@Param("bean") OrderSubscribeBean orderSubscribeBean, @Param("oldStatus") Integer oldStatus);

    /**
     * 查询当天支付成功的
     *
     * @return
     */
    List<LocalDateTime> getTodaySubscribeCount();

    /**
     * 查询不是取消状态且提车的订单（包含已支付续订单）
     *
     * @param status
     * @return
     */
    List<Map<String, Object>> getEffectiveOrderVehicleStatistics(@Param("status") Integer status);

    /**
     * 查询每个门店下生效订单（提车、续订生效）数量
     *
     * @param statusList
     * @return
     */
    List<Map<String, Object>> getEffectiveOrderStoreStatistics(@Param("statusList") List<Integer> statusList);

    /**
     * 查询统计不是已取消状态且已支付的订阅订单数量
     *
     * @return
     */
    List<Map<String, Object>> getEffectiveOrderGoodsStatisticsWherePay(@Param("status") Integer status);

    /**
     * 查询所有已支付未取消的订阅订单信息
     *
     * @param status
     * @return
     */
    List<OrderSubscribeBean> getHavePaidOrder(@Param("status") Integer status);
}